home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / main.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  15KB  |  614 lines

  1. /* 男は一本槍 */
  2.  
  3. /* main.c */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/dos.h>
  9. #include <sys/iocs.h>
  10. #include <XSP2lib.H>
  11. #include <pcm8afnc.h>
  12.  
  13.  
  14. #define GLOBAL_DEFINE        /* グローバル変数を確保する */
  15. #include "main.h"
  16. #include "player.h"
  17. #include "shot.h"
  18. #include "enemy.h"
  19. #include "eshot.h"
  20. #include "effect.h"
  21. #include "entry.h"
  22. #include "psearch.h"
  23. #include "gvram.h"
  24. #include "txfont.h"
  25. #include "sound.h"
  26.  
  27. static int old_crtmod;
  28.  
  29. #define PCG_MAX    322        /* パターンデータの個数 */
  30. #define REF_MAX    564        /* リファレンスデータの個数 */
  31. #define FRM_MAX    10588        /* フレームデータの個数 */
  32.  
  33. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  34. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  35. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  36. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  37.  
  38. static int sizeof_pcg = 0;    /* スプライトPCGパターン読み込み数 */
  39. static int sizeof_ref = 0;    /* 複合スプライトリファレンスデータ読み込み数 */
  40. static int sizeof_frm = 0;    /* 複合スプライトフレームデータ読み込み数 */
  41.  
  42. static int high_score = 68000;
  43.  
  44. static unsigned short pal_dat[16][15];    /* スプライトパレットデータ */
  45. static unsigned short title_pal_dat[16][15];    /* タイトルロゴのスプライトパレットデータ */
  46.  
  47. enum {
  48.     SELECT_START = 0, SELECT_EXIT,
  49. };
  50.  
  51. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  52.  
  53.  
  54.  
  55. void usage (void)
  56. {
  57.     printf (
  58.                "縦スクロールシューティング・一本槍 IPPON.X ver1.00"
  59.                "        programmed by Mitsuky <FreeSoftware>\n"
  60.         );
  61. }
  62.  
  63.  
  64.  
  65. /* ボタンが押されるか timer フレーム経つまで待つ */
  66. static void WaitTime (int timer)
  67. {
  68.     int t = timer;
  69.     while ((_iocs_joyget (0) & 0x60) != 0x60);
  70.     do {
  71.         xsp_vsync (1);
  72.         if ((_iocs_joyget (0) & 0x60) != 0x60)
  73.             break;
  74.     } while (t--);
  75.     while ((_iocs_joyget (0) & 0x60) != 0x60);
  76. }
  77.  
  78.  
  79.  
  80. static void TextClear (void)
  81. {
  82.     _iocs_txrascpy (256 / 4 * 256, 256 / 4, 0b1111);    /* テキスト画面クリア */
  83. }
  84.  
  85.  
  86.  
  87. /* 垂直同期ごとに呼ばれるルーチン */
  88. static void VdispRoutine (void)
  89. {
  90.     static int y0 = 0, y1 = 0;
  91.  
  92.     if (pause_flag)
  93.         return;        /* ポーズ中ならここまで */
  94.  
  95.     *(volatile unsigned int *) 0xe80018 = *(volatile unsigned int *) 0xe8001c = y0;
  96.     y0 -= 2;
  97.     y0 &= 511;
  98.  
  99.     *(volatile unsigned int *) 0xe80020 = *(volatile unsigned int *) 0xe80024 = y1;
  100.     y1 -= 4;
  101.     y0 &= 511;
  102. }
  103.  
  104.  
  105.  
  106. /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
  107. void Tini (void)
  108. {
  109.     int sp;
  110.  
  111.     switch (error_level) {
  112.     case ERROR_NON:
  113.         xsp_vsyncint_off ();
  114.         pcm8a_vsyncint_off ();
  115.         xsp_off ();
  116.         /* 画面モードを元に戻す */
  117.         sp = _iocs_b_super (0);
  118.         *(unsigned short *) 0xe8e006 &= 0xfffd;        /* HRL ビットを元に戻す */
  119.         _iocs_b_super (sp);
  120.         _iocs_crtmod (old_crtmod);
  121.         _iocs_g_clr_on ();    /* 一応 */
  122.         _dos_kflushio (0xff);    /* キーバッファをクリア */
  123.         /* break が無い事に注意 */
  124.  
  125.     case ERROR_SOUND:
  126.         SoundTini ();
  127.         /* break が無い事に注意 */
  128.     case ERROR_FILE:
  129.         _iocs_tgusemd (1, 3);
  130.         /* break が無い事に注意 */
  131.     case ERROR_GUSEMD:
  132.         _iocs_tgusemd (0, 3);
  133.         /* break が無い事に注意 */
  134.     case ERROR_TUSEMD:
  135.         /* break が無い事に注意 */
  136.     default:
  137.         break;
  138.     }
  139.  
  140.     _iocs_b_curon ();
  141.  
  142.     if (error_level != ERROR_NON) {
  143.         /* エラーが発生した場合 */
  144.         puts (error_message);
  145.         exit (-1);    /* 終了する */
  146.     }
  147. }
  148.  
  149.  
  150.  
  151. /* 起動時のファイル読み込み */
  152. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  153. /* 返り値 : 読み込んだ項目数 */
  154. static int LoadFile (char *fname, void *ptr, size_t size, size_t n)
  155. {
  156.     FILE *fp;
  157.     int i;
  158.  
  159.     fp = fopen (fname, "rb");
  160.     if (fp == NULL) {
  161.         static char e[256];
  162.         error_level = ERROR_FILE;
  163.         error_message = e;
  164.         sprintf (e, "ファイル %s が読み込めません\n", fname);
  165.         Tini ();    /* 返ってこない */
  166.     }
  167.     i = fread (ptr, size, n, fp);
  168.     fclose (fp);
  169.  
  170.     return (i);        /* 返り値は読み込み項目数 */
  171. }
  172.  
  173.  
  174.  
  175. /* XSP 各種データ読み込み・ファイル名は拡張子を付けずに指定すること */
  176. /* 返り値 : 複合スプライトNo. */
  177. static short LoadXSP (char *fname)
  178. {
  179.     int i;
  180.     int p, f, r;
  181.     short obj_no = sizeof_ref;
  182.     char temp_fname[92];
  183.  
  184.     strcpy (temp_fname, fname);
  185.     strcat (temp_fname, ".FRM");
  186.     f = LoadFile (temp_fname, &frm_dat[sizeof_frm], sizeof (XOBJ_FRM_DAT), FRM_MAX - sizeof_frm);
  187.  
  188.     strcpy (temp_fname, fname);
  189.     strcat (temp_fname, ".REF");
  190.     r = LoadFile (temp_fname, &ref_dat[sizeof_ref], sizeof (XOBJ_REF_DAT), REF_MAX - sizeof_ref);
  191.  
  192.     strcpy (temp_fname, fname);
  193.     strcat (temp_fname, ".XSP");
  194.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  195.  
  196.     /* FRM_DAT[].pt 補正 */
  197.     for (i = 0; i < f; i++)
  198.         frm_dat[sizeof_frm + i].pt += sizeof_pcg / 128;
  199.  
  200.     /* REF_DAT[].ptr 補正 */
  201.     for (i = 0; i < r; i++)
  202.         (int) ref_dat[sizeof_ref + i].ptr += (int) (&frm_dat[sizeof_frm]);
  203.     sizeof_pcg += p;
  204.     sizeof_frm += f;
  205.     sizeof_ref += r;
  206.  
  207. #ifdef DEBUG
  208.     printf ("%s を読み込みました sizeof_ref = %hd\n", fname, obj_no);
  209. #endif
  210.  
  211.     return (obj_no);
  212. }
  213.  
  214.  
  215.  
  216. /* SP データ読み込み */
  217. static short LoadSP (char *fname)
  218. {
  219.     int p;
  220.     short sp_no = sizeof_pcg / 128;
  221.     char temp_fname[92];
  222.  
  223.     strcpy (temp_fname, fname);
  224.     strcat (temp_fname, ".SP");
  225.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  226.  
  227.     sizeof_pcg += p;
  228.  
  229. #ifdef DEBUG
  230.     printf ("%s を読み込みました sp_no = %hd\n", fname, sp_no);
  231. #endif
  232.     return (sp_no);
  233. }
  234.  
  235.  
  236.  
  237. /* 起動時に1度だけ呼ばれる */
  238. static void Init (void)
  239. {
  240.     int sp;
  241.     int i;
  242.     static unsigned short crtcdata[9] =
  243.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
  244.     static unsigned short textpalet[16] =
  245.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  246.     unsigned short *s, *d;
  247.  
  248.     error_message = NULL;
  249.  
  250.     /* テキスト画面の使用状況をチェック */
  251.     error_level = ERROR_TUSEMD;
  252.     if (_iocs_tgusemd (1, -1) == 2) {    /* ユーザーが使用中なら */
  253.         error_message = "テキスト VRAM が使用中です";
  254.         Tini ();
  255.     }
  256.     _iocs_tgusemd (1, 2);
  257.     /* グラフィック画面の使用状況をチェック */
  258.     error_level = ERROR_GUSEMD;
  259.     i = _iocs_tgusemd (0, -1);
  260.     if ((i == 1) || (i == 2)) {    /* システムまたはユーザーが使用中なら */
  261.         error_message = "グラフィック VRAM が使用中です";
  262.         Tini ();
  263.     }
  264.     _iocs_tgusemd (0, 2);
  265.  
  266.  
  267.     /* 各種ファイル読み込み */
  268.     error_level = ERROR_FILE;
  269.     obj_player = LoadXSP ("SP/PLAYER");
  270.     obj_shot = LoadXSP ("SP/SHOT");
  271.     obj_zako02 = LoadXSP ("SP/ZAKO02");
  272.     obj_covern = LoadXSP ("SP/COVERN");
  273.     obj_oplaser = LoadXSP ("SP/OPLASER");
  274.     obj_round4 = LoadXSP ("SP/ROUND4");
  275.     obj_coverf = LoadXSP ("SP/COVERF");
  276.     obj_sword = LoadXSP ("SP/SWORD");
  277.     obj_searchz = LoadXSP ("SP/SEARCHZ");
  278.     obj_zako03 = LoadXSP ("SP/ZAKO03");
  279.     obj_lboss01 = LoadXSP ("SP/LBOSS01");
  280.     obj_explall = LoadXSP ("SP/EXPLALL");
  281.     obj_points = LoadXSP ("SP/POINTS");
  282.     obj_title = LoadXSP ("SP/TITLE");
  283.  
  284.     sp_core = LoadSP ("SP/CORE");
  285.     sp_eshot = LoadSP ("SP/ESHOT");
  286.     sp_eshotera = LoadSP ("SP/ESHOTERA");
  287.  
  288. #ifdef DEBUG
  289.     printf ("    PCG 使用数 = %d\n    REF 使用数 = %d\n    FRM 使用数 = %d\n",
  290.         sizeof_pcg / 128, sizeof_ref, sizeof_frm);
  291. #endif
  292.  
  293.     LoadFile ("SP/MAIN.PAL", &pal_dat, sizeof (unsigned short), 16 * 15);
  294.     LoadFile ("SP/TITLE.PAL", &title_pal_dat, sizeof (unsigned short), 16 * 15);
  295.  
  296.     LoadFile ("TBL/PSTABLE.DAT", pstable, sizeof (unsigned char), 256 * 256);
  297.     LoadFile ("TBL/RNDTABLE.DAT", rndtable, sizeof (unsigned char), 256);
  298.     LoadFile ("TBL/XYTABLE.DAT", &xytable, sizeof (VECTOR), SPEED_MAX * 256);
  299.     LoadFile ("DAT/STAGE.DAT", &stage_data, sizeof (ENTRY), ENTRY_MAX);
  300.     LoadFile ("DAT/ALPHA2.DAT", &font_data, sizeof (unsigned char), 2048);
  301.  
  302.     LoadFile ("BG/STAGE.MAP", bg_map, sizeof (char), 30 + 32 * 128 * 2);
  303.     LoadFile ("BG/STAGE.SP", bg_sp, sizeof (char), 32 * 256);
  304.     LoadFile ("BG/STAGE.PAL", bg_pal, sizeof (unsigned short), 64);
  305.  
  306.     error_level = ERROR_SOUND;
  307.     SoundInit ();
  308.  
  309.     error_level = ERROR_NON;    /* エラーなし */
  310.  
  311.     /* XSP 関連の初期化 */
  312.     xsp_on ();
  313.     xsp_mode (3);
  314.     /* パターンデータを定義 */
  315.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  316.     xsp_objdat_set (ref_dat);
  317.  
  318.  
  319.     /* 画面モードの初期化 */
  320.     /* 256x256ドット 31kHz 256色モードに */
  321.     old_crtmod = _iocs_crtmod (-1);        /* 前の CRTMOD を保存 */
  322.     _iocs_crtmod (10);    /* 256x256dot 31kHz 256色 */
  323.     _iocs_g_clr_on ();    /* 一応 */
  324.     _iocs_sp_init ();    /* スプライトの初期化 */
  325.     _iocs_sp_on ();
  326.  
  327.     /* 256x256 正方形モードを作る */
  328.     sp = _iocs_b_super (0);
  329.     *(unsigned short *) 0xe80028 = crtcdata[8];
  330.     d = (unsigned short *) 0xe80002;
  331.     for (i = 1; i < 8; i++)
  332.         *d++ = crtcdata[i];
  333.     *(unsigned short *) 0xe80000 = crtcdata[0];
  334.  
  335.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  336.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  337.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  338.     *(unsigned short *) 0xeb080e = crtcdata[6];
  339.     *(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
  340.         = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
  341.         = (0 << 16) + 0;    /* グラフィック画面の座標 */
  342.  
  343.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  344.  
  345.     /* テキスト画面のパレットを設定 */
  346.     s = (unsigned short *) 0xe82200;
  347.     for (i = 0; i < 16; i++)
  348.         *s++ = textpalet[i];
  349.  
  350.     _iocs_b_super (sp);
  351.  
  352.     TxfontInit ();        /* フォント関連の初期化 */
  353.     _iocs_b_curoff ();    /* カーソルを消す */
  354.  
  355.     xsp_vsyncint_on (&VdispRoutine);
  356.     pcm8a_vsyncint_on ();
  357. }
  358.  
  359.  
  360.  
  361. /* タイトル画面の表示 */
  362. static int Title (void)
  363. {
  364.     int cy = 0;        /* カーソル位置 */
  365.     int old_t;
  366.     int t;
  367.     int i, j;
  368.     int sp;
  369.     char temp_str[32];
  370.     enum {
  371.         JOY_NON = 0, JOY_UP, JOY_DOWN
  372.     };
  373.  
  374.     sp = _iocs_b_super (0);
  375.     *(unsigned short *) 0xe82600 &= 0xfff0;        /* グラフィック画面表示オフ */
  376.     _iocs_b_super (sp);
  377.  
  378.     TextClear ();
  379.  
  380.     /* スプライトのパレットデータを定義 */
  381.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  382.     {
  383.         unsigned short *p = (unsigned short *) title_pal_dat;
  384.         for (i = 1; i < 16; i++)
  385.             for (j = 0; j < 16; j++)
  386.                 _iocs_spalet (0x80000000 | j, i, *p++);
  387.     }
  388.  
  389. #define    IPPON_X    24        /* "IPPON-YARI" を表示する座標 */
  390. #define    IPPON_Y    (8*16)
  391. #if    0
  392.     /* "IPPON" と "YARI" が上下からやってくる */
  393.     for (i = 16; i > 0; i--) {
  394.         xsp_vsync (1);
  395.         xobj_set (IPPON_X, IPPON_Y - i * 12, obj_title + 2, 0x0130);    /* IPPON(影) */
  396.         xobj_set (IPPON_X + 9 * 16, IPPON_Y + i * 12, obj_title + 3, 0x0130);    /* YARI(影) */
  397.         xsp_out ();
  398.     }
  399. #else
  400.     /* "IPPON" と "YARI" が上下からやってくる */
  401.     for (i = 12; i > 0; i--) {
  402.         xsp_vsync (1);
  403.         xobj_set (IPPON_X, IPPON_Y + i * 2, obj_title + 2, 0x0130);    /* IPPON(影) */
  404.         xobj_set (IPPON_X + 9 * 16, IPPON_Y + i * 2, obj_title + 3, 0x0130);    /* YARI(影) */
  405.         xsp_out ();
  406.     }
  407. #endif
  408.  
  409.     xobj_set (IPPON_X, IPPON_Y, obj_title, 0x0130);        /* IPPON */
  410.     xobj_set (IPPON_X + 9 * 16, IPPON_Y, obj_title + 1, 0x0130);    /* YARI */
  411.     xsp_out ();
  412.  
  413.     TxfontCursor (0, 26);
  414.     TxfontPuts (
  415.                " (C)PROGRAMMED BY MITSUKY 2000\n"
  416.                "     GRAPHICS BY H.SUZUKI\n\n"
  417.                " VER1.0 FOR DENNOU CLUB VOL.147\n");
  418.  
  419. #define    START_X    10        /* "START" を表示する座標 */
  420. #define    START_Y    20
  421.  
  422.     TxfontCursor (0, START_Y);
  423.     TxfontPuts (
  424.                "        START\n"
  425.                "        EXIT\n"
  426.         );
  427.     TxfontCursor (START_X, START_Y + cy);
  428.     TxfontPutchar ('>');
  429.  
  430.     while ((_iocs_joyget (0) & 0b01101111) != 0b01101111);    /* ジョイスティックが離されるまで待つ */
  431.     while (_iocs_bitsns (0x0c) & 0b10);    /* [BREAK] が離されるまで待つ */
  432.  
  433. #define    SCORE_X    2
  434. #define    SCORE_Y    0
  435. #define HIGH_SCORE_X    21
  436.     sprintf (temp_str, "HI %06d", high_score);
  437.     TxfontCursor (HIGH_SCORE_X, SCORE_Y);
  438.     TxfontPuts (temp_str);
  439.     sprintf (temp_str, "SCORE %06d", score);
  440.     TxfontCursor (SCORE_X, SCORE_Y);
  441.     TxfontPuts (temp_str);
  442.  
  443.     old_t = JOY_NON;
  444.     do {
  445.         xsp_vsync (1);
  446.         t = _iocs_joyget (0);
  447.         if (((t & 0b0001) == 0) && (cy > 0)) {    /* 上 */
  448.             if (old_t != JOY_UP) {
  449.                 TxfontCursor (START_X, START_Y + cy);
  450.                 TxfontPutchar (' ');
  451.                 cy--;
  452.                 TxfontCursor (START_X, START_Y + cy);
  453.                 TxfontPutchar ('>');
  454.                 old_t = JOY_UP;
  455.             }
  456.         }
  457.         if (((t & 0b0010) == 0) && (cy < 1)) {    /* 下 */
  458.             if (old_t != JOY_DOWN) {
  459.                 TxfontCursor (START_X, START_Y + cy);
  460.                 TxfontPutchar (' ');
  461.                 cy++;
  462.                 TxfontCursor (START_X, START_Y + cy);
  463.                 TxfontPutchar ('>');
  464.                 old_t = JOY_DOWN;
  465.             }
  466.         }
  467.         if ((t & 0b1111) == 0b1111) {
  468.             old_t = JOY_NON;
  469.         }
  470.         if (_iocs_bitsns (0x0c) & 0b10) {    /* [BREAK] */
  471.             while (_iocs_bitsns (0x0c) & 0b10);
  472.             cy = SELECT_EXIT;
  473.             break;
  474.         }
  475.     } while ((t & 0b01000000) != 0);
  476.     while ((_iocs_joyget (0) & 0b01000000) == 0);
  477.     xsp_out ();
  478.  
  479.     return (cy);
  480. }
  481.  
  482.  
  483.  
  484. /* ゲーム本体 */
  485. static void Game (void)
  486. {
  487.     int i, j;
  488.     int sp;
  489.     int old_score = -1;    /* 初回は必ず表示されるように */
  490.     int sprites;        /* 表示スプライト数 */
  491.     char temp_str[32];
  492.  
  493.     TextClear ();
  494.     /* グラフィック画面のパレットを設定 */
  495.     for (i = 0; i < 64; i++)
  496.         _iocs_gpalet (i + 16, bg_pal[i]);
  497.     GvramInit ();        /* グラフィック画面関連の初期化 */
  498.     /* スプライトのパレットデータを定義 */
  499.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  500.     {
  501.         unsigned short *p = (unsigned short *) pal_dat;
  502.         for (i = 1; i < 16; i++)
  503.             for (j = 0; j < 16; j++)
  504.                 _iocs_spalet (0x80000000 | j, i, *p++);
  505.     }
  506.  
  507.     sp = _iocs_b_super (0);
  508.     *(unsigned short *) 0xe82600 |= 0x000f;        /* グラフィック画面表示オン */
  509.     _iocs_b_super (sp);
  510.  
  511.     score = 0;
  512.     sprintf (temp_str, "HI %06d", high_score);
  513.     TxfontCursor (HIGH_SCORE_X, SCORE_Y);
  514.     TxfontPuts (temp_str);
  515.  
  516.     PlayerInit ();
  517.     ShotInit ();
  518.     EnemyInit ();
  519.     EshotInit ();
  520.     EffectInit ();
  521.     EntryInit ();
  522.  
  523.     PlayerAlloc ();
  524.     player->rest = 3;    /* 残機設定 */
  525.     DispRest ();        /* 残機数表示 */
  526.     pause_flag = 0;
  527.  
  528.     do {
  529.         xsp_vsync (0);    /* 垂直同期を待つ */
  530.  
  531.         EntryMove ();
  532.         PlayerMove ();
  533.         ShotMove ();
  534.         EnemyMove ();
  535.         EshotMove ();
  536.         EffectMove ();
  537.         SoundMove ();
  538.  
  539.         sprites = xsp_out ();    /* 表示 */
  540.  
  541.         if (score != old_score) {    /* 更新された時のみ表示 */
  542.             old_score = score;
  543.             sprintf (temp_str, "SCORE %06d", score);
  544.             TxfontCursor (SCORE_X, SCORE_Y);
  545.             TxfontPuts (temp_str);
  546.         }
  547. #ifdef DEBUG
  548.         sprintf (temp_str, "ESHOT  %03hd", eshot_sum);
  549.         TxfontCursor (0, 2);
  550.         TxfontPuts (temp_str);
  551.         sprintf (temp_str, "ENEMY  %03hd", enemy_sum);
  552.         TxfontCursor (0, 3);
  553.         TxfontPuts (temp_str);
  554.         sprintf (temp_str, "SPRITES %06d", sprites);
  555.         TxfontCursor (0, 4);
  556.         TxfontPuts (temp_str);
  557. #endif
  558.     } while ((player->game_over == GAME_PLAY) || (player->game_over == GAME_COMPLETE));
  559.  
  560.  
  561.     pause_flag = !0;
  562.     switch (player->game_over) {
  563.     case GAME_OVER:
  564.         TxfontCursor (11, 14);
  565.         TxfontPuts ("GAME OVER");
  566.         SoundMusic (MUSIC_GAME_OVER);
  567.         WaitTime (55 * 10);
  568.         break;
  569.     case GAME_COMPLETE:    /* ここには来ないはず */
  570.     case GAME_COMPLETE2:
  571.         xsp_out ();
  572.         while (--player->rest > 0) {
  573.             score += 10000;        /* 残機1機につき 10000pts */
  574.             DispRest ();    /* 残機数表示 */
  575.             sprintf (temp_str, "SCORE %06d", score);
  576.             TxfontCursor (SCORE_X, SCORE_Y);
  577.             TxfontPuts (temp_str);
  578.             if (player->rest > 1)
  579.                 WaitTime (30);
  580.         }
  581.         TxfontCursor (11, 14);
  582.         TxfontPuts (" COMPLETE");
  583.         SoundMusic (MUSIC_GAME_OVER);
  584.         WaitTime (55 * 10);
  585.         break;
  586.     case GAME_ABORT:
  587.         SoundFadeOut (64);
  588.         break;
  589.     default:
  590.         break;
  591.     }
  592.     xsp_out ();        /* スプライトを消去 */
  593.  
  594.     if (score > high_score)
  595.         high_score = score;
  596. }
  597.  
  598.  
  599.  
  600. int main (int argc, char *argv[])
  601. {
  602.     if (argc != 1) {
  603.         usage ();
  604.         return (-1);
  605.     }
  606.     Init ();
  607.     while (Title () == SELECT_START) {
  608.         Game ();
  609.     }
  610.     Tini ();
  611.  
  612.     return (0);
  613. }
  614.